package com.ms.dao;

import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.ms.entity.Event;
import org.apache.ibatis.annotations.*;
import org.springframework.stereotype.Repository;

import java.util.List;
import java.util.Map;

/**
 * 比赛数据访问接口 - 定义比赛相关的数据库操作
 * 使用MyBatis-Plus
 */
@Mapper
public interface EventMapper extends BaseMapper<Event> {

    /**
     * 获取所有比赛
     *
     * @return 比赛列表
     */
    @Select("SELECT * FROM event WHERE status = '进行中' ORDER BY eventTime ASC")
    List<Event> selectAll();

    /**
     * 根据类别获取比赛
     *
     * @param category 比赛类别
     * @return 比赛列表
     */
    @Select("SELECT * FROM event WHERE category = #{category} AND status = '进行中' ORDER BY eventTime ASC")
    List<Event> selectByCategory(String category);

    /**
     * 根据比赛ID获取所有项目
     *
     * @param gameID 比赛ID
     * @return 项目列表
     */
    @Select("SELECT * FROM event WHERE gameID = #{gameID} ORDER BY eventTime ASC")
    List<Event> selectByGameId(String gameID);

    /**
     * 增加比赛当前参与人数
     *
     * @param eventID 比赛ID
     * @return 更新的行数
     */
    @Update("UPDATE event SET currentParticipants = currentParticipants + 1 WHERE eventID = #{eventID}")
    int increaseParticipants(String eventID);

    /**
     * 减少比赛当前参与人数
     *
     * @param eventID 比赛ID
     * @return 更新的行数
     */
    @Update("UPDATE event SET currentParticipants = currentParticipants - 1 WHERE eventID = #{eventID}")
    int decreaseParticipants(String eventID);

    /**
     * 检查用户是否已报名某比赛
     *
     * @param userID  用户ID
     * @param eventID 比赛ID
     * @return 报名记录数量
     */
    @Select("SELECT COUNT(*) FROM registration WHERE userID = #{userID} AND eventID = #{eventID} AND isUsing = 1")
    int checkUserRegistration(@Param("userID") String userID, @Param("eventID") String eventID);

    /**
     * 用户报名比赛
     *
     * @param userID  用户ID
     * @param eventID 比赛ID
     * @return 插入的行数
     */
    @Insert("INSERT INTO registration (userID, eventID, reg_Time, isUsing) VALUES (#{userID}, #{eventID}, NOW(), 1)")
    int registerUserForEvent(@Param("userID") String userID, @Param("eventID") String eventID);

    /**
     * 用户取消报名
     *
     * @param userID  用户ID
     * @param eventID 比赛ID
     * @return 更新的行数
     */
    @Update("UPDATE registration SET isUsing = 0 WHERE userID = #{userID} AND eventID = #{eventID}")
    int cancelRegistration(@Param("userID") String userID, @Param("eventID") String eventID);

    /**
     * 获取用户报名的所有比赛
     *
     * @param userID 用户ID
     * @return 比赛列表
     */
    @Select("SELECT e.* FROM event e JOIN registration r ON e.eventID = r.eventID WHERE r.userID = #{userID} AND r.isUsing = 1")
    List<Event> selectEventsByUserId(String userID);

    /**
     * 根据主办方ID获取所有比赛
     *
     * @param organizerId 主办方ID
     * @return 比赛列表
     */
    @Select("SELECT games_id, game_name FROM game WHERE or_id = #{organizerId}")
    List<Map<String, Object>> selectGamesByOrganizerId(Integer organizerId);
    
    /**
     * 根据比赛ID获取所有项目（简化版，只获取ID和名称）
     *
     * @param gameId 比赛ID
     * @return 项目列表
     */
    @Select("SELECT eventID, eventName FROM event WHERE gameID = #{gameId}")
    List<Map<String, Object>> selectEventsByGameIdSimple(Integer gameId);
}